package com.chencong.test;

import java.io.*;
import java.net.Socket;

/**
 * @author chencong
 * @date 2020/12/11 下午3:20
 */
public class ServerThread implements Runnable {
    private Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {


        try {


            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            line = br.readLine();
//            br.close();//通信管道的流不需要关
            //获取前端传来的页面请求
            String url = line.split(" ")[1];
            if ("/".equals(url)) {
                url = "/login.html";
            }
            while((line = br.readLine())!=null){
                System.out.println(line);
            }
            System.out.println(Thread.currentThread().getName() + "接收请求路径:" + url);
            File file = new File("BigDemo_01/doc/pages" + url);
//            File file = new File("BigDemo_01/doc/pages" + url);
            //创建缓存字节输入流读取请求的文件
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            //创建缓存字节输出流发送请求的文件
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            //状态码: 后端发送给前端 如果发送成功 200
            dos.write("HTTP/1.1 200 OK\n".getBytes());
            //告诉浏览器数据的长度
//            dos.write(("Content-Length: " + bis.available() + "\n").getBytes());
            /**
             * 此处的url中包含了html  和css  的一些静态的资源
             *    但是静态资源在前端页面的渲染方式又不一样  所以在这里做个判断
             */
            if (url.endsWith(".html")) {
                dos.write("Content-Type: text/html; charset=utf-8;\n".getBytes());
            } else if (url.endsWith(".css")) {
                dos.write("Content-Type: text/css; charset=utf-8;\n".getBytes());
            }
            //使用换行符对响应头和文件数据进行分开  不然文件数据没法显示在页面上
            dos.write("\n".getBytes());
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                dos.write(buffer, 0, len);
            }
            System.out.println(Thread.currentThread().getName() + "发送完毕.");

            //通信管道里的流不需要关,关了有可能造成数据丢失
            bis.close();//本地读取文件的流可以关闭
//            bos.close();//通信管道里的流不需要关
            socket.shutdownOutput();  //关闭写入流
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(Thread.currentThread().getName() + "异常退出");
        }
    }
}
